定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
场景
需要层层审批的,直到某一层可以给出具体结果。
比如离职申请,首先发给团队主管,然后团队主管发给部门经理,之后再给总经理这样,一层一层上传,直到信息传给能够给出反馈的人。
UML
示例代码
//统一处理接口
abstract class Handler {
protected Handler handler;
public void setHandler(Handler handler) {
this.handler = handler;
}
public abstract void HandlerRequest(int req);
}
//具体实现 处理不同的内容
public class ConcreteHandler1 extends Handler {
@Override
public void HandlerRequest(int req) {
// TODO Auto-generated method stub
if (req >= 0 && req < 10) {
System.out.println("Handler1 handle " + req + " now");
} else if (handler != null) {
handler.HandlerRequest(req);
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void HandlerRequest(int req) {
// TODO Auto-generated method stub
if (req >= 10 && req < 20) {
System.out.println("Handler2 handle " + req + " now");
} else if (handler != null) {
handler.HandlerRequest(req);
}
}
}
public class ConcreteHandler3 extends Handler {
@Override
public void HandlerRequest(int req) {
// TODO Auto-generated method stub
if (req >= 20 && req < 30) {
System.out.println("Handler3 handle " + req + " now");
} else if (handler != null) {
handler.HandlerRequest(req);
}
}
}
//客户代码
public static void main(String[] args) {
// TODO Auto-generated method stub
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.setHandler(h2);
h2.setHandler(h3);
List list = new ArrayList();
list.add(2);
list.add(5);
list.add(14);
list.add(22);
list.add(18);
list.add(3);
list.add(27);
list.add(20);
for(Integer i : list) {
h1.HandlerRequest(i);
}
}
//输出
Handler1 handle 2 now
Handler1 handle 5 now
Handler2 handle 14 now
Handler3 handle 22 now
Handler2 handle 18 now
Handler1 handle 3 now
Handler3 handle 27 now
Handler3 handle 20 now
评价
一个很好的优点是,当客户提交一个请求时,请求是按着链传递,直至有一个ConcreteHandler对象负责处理。也就是请求一定会被处理。
另外降低了耦合度。因为这个结构,接收者和发送者都不清楚对方的明确信息,且链中对象也不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。
最后,可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。